package com.yzg.simple.netty.websoket;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

/**
 * @author misterWei
 * @mailbox mynameisweiyan@gmail.com
 */
public class NettyWebSoketServerInitlializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        //HttpServerCodec 用来编码解码
        // 添加Http 的编解码器,由于webSocket 是基于Http协议的
        pipeline.addLast(new HttpServerCodec());

        //是以块(大批数据形式)的方式写入的,所以ChunkedWriteHandler 用来块处理
        pipeline.addLast(new ChunkedWriteHandler());

        // Http 传输过程中的数据是分段的,该Handler 用来把这些分段进行聚合
        // 这就就是为什么，当浏览器发送大量数据时，就会发出多次 http 请求
        pipeline.addLast(new HttpObjectAggregator(8192));
        /**
         * 说明
         * 1. 对应 websocket ，它的数据是以 帧(frame) 形式传递
         * 2. 可以看到 WebSocketFrame 下面有六个子类
         * 3. 浏览器请求时 ws://localhost:7000/send 表示请求的 uri
         * 4. WebSocketServerProtocolHandler 核心功能是将 http 协议升级为 ws 协议 , 保持长连接
         * 5. 是通过一个 状态码 101
         */
        pipeline.addLast(new WebSocketServerProtocolHandler("/send"));
        //添加自己的Handler
        pipeline.addLast(new NettyWebSoketServerHandler());
    }
}
